﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using System.Diagnostics.Contracts;

namespace Numero1DataReader
{
    public partial class Form1 : Form
    {
        private ConnexionDB connexion;
        private Dictionary<string, double> cotes;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            connexion = ConnexionDB.Creer();
            foreach (var objet in connexion.ExecuterReader("SELECT * FROM cours"))
            {
                string sigle = objet["sigle"].ToString();
                ListViewItem item = new ListViewItem(sigle);
                item.SubItems.Add(objet["nom"].ToString());
                item.SubItems.Add(objet["description"].ToString());
                item.SubItems.Add(objet["credit"].ToString());

                List<OleDbParameter> parametres = new List<OleDbParameter>();
                parametres.Add(new OleDbParameter(sigle, sigle));
                double cote = 0;
                int nbrCote = 0;
                foreach (var objet2 in connexion.ExecuterReader("SELECT cote FROM resultats where sigle = ?", parametres))
                {
                    if (!String.IsNullOrEmpty(objet2["cote"].ToString()))
                    {
                        nbrCote++;
                        cote += Cotes[objet2["cote"].ToString()];
                    }
                }
                cote = cote / nbrCote;
                item.SubItems.Add(CoteString(cote));
                listView1.Items.Add(item);
            }

            foreach (var objet in connexion.ExecuterReader("SELECT * FROM resultats"))
            {
                ListViewItem item = new ListViewItem(objet["matricule"].ToString());
                item.SubItems.Add(objet["sigle"].ToString());
                item.SubItems.Add(objet["cote"].ToString());
                listView2.Items.Add(item);
            }

            foreach (var objet in connexion.ExecuterReader("SELECT * FROM etudiants"))
            {
                string matricule = objet["matricule"].ToString();
                ListViewItem item = new ListViewItem(matricule);
                item.SubItems.Add(objet["nom"].ToString());
                item.SubItems.Add(objet["prenom"].ToString());
                item.SubItems.Add(objet["adresse"].ToString());
                item.SubItems.Add(objet["ville"].ToString());
                item.SubItems.Add(objet["code"].ToString());
                item.SubItems.Add(objet["tel"].ToString());
                item.SubItems.Add(objet["departement"].ToString());

                /*OleDbParameter parametre = new OleDbParameter();
                parametre.ParameterName = matricule;
                parametre.OleDbType = OleDbType.VarChar;
                 */
                List<OleDbParameter> parametres = new List<OleDbParameter>();
                parametres.Add(new OleDbParameter(matricule, matricule));
                double cote = 0;
                int nbrCote = 0;
                foreach (var objet2 in connexion.ExecuterReader("SELECT cote FROM resultats where matricule = ?", parametres))
                {
                    if (!String.IsNullOrEmpty(objet2["cote"].ToString()))
                    {
                        nbrCote++;
                        cote += Cotes[objet2["cote"].ToString()];
                    }
                }
                cote = cote / nbrCote;
                item.SubItems.Add(CoteString(cote));
                listView3.Items.Add(item);
            }
        }

        private Dictionary<string, double> Cotes
        {
            get
            {
                if (cotes == null)
                {
                    cotes = new Dictionary<string, double>();
                    cotes.Add("A+", 4.3);
                    cotes.Add("A", 4);
                    cotes.Add("A-", 3.7);
                    cotes.Add("B+", 3.3);
                    cotes.Add("B", 3);
                    cotes.Add("B-", 2.7);
                    cotes.Add("C+", 2.3);
                    cotes.Add("C", 2);
                    cotes.Add("C-", 1.7);
                    cotes.Add("D+", 1.3);
                    cotes.Add("D", 1);
                    cotes.Add("E", 0);
                }
                return cotes;
            }
        }

        private string CoteString(double coteMoyenne)
        {
            Contract.Requires(Cotes.Values != null, "Le tableau de cotes doit être défini­.");

            string coteOK = string.Empty;
            foreach (double cote in Cotes.Values)
            {
                if (cote <= coteMoyenne)
                {
                    coteOK = Cotes.First(c => cote == c.Value).Key;
                    break;
                }
            }
            return coteOK;
        }

        private void Form1_Leave(object sender, EventArgs e)
        {
            ConnexionDB.Detruire();
        }
    }
}
